// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-escape-string
es6id: B.2.1.1
description: Escaping of code units below 255
info: |
    [...]
    5. Repeat, while k < length,
       a. Let char be the code unit (represented as a 16-bit unsigned integer)
          at index k within string.
       [...]
       d. Else char < 256,
          i. Let S be a String containing three code units "%xy" where xy are
             the code units of two uppercase hexadecimal digits encoding the
             value of char.
       [...]
---*/

function Test() {
    assert.sameValue(
      escape('\x00\x01\x02\x03'),
      '%00%01%02%03',
      'characters: \\x00\\x01\\x02\\x03'
    );

    assert.sameValue(
      escape('!"#$%&\'()'),
      '%21%22%23%24%25%26%27%28%29',
      'characters preceding "*": !"#$%&\'()'
    );

    assert.sameValue(escape(','), '%2C', 'character between "+" and "-": ,');

    assert.sameValue(
      escape(':;<=>?'),
      '%3A%3B%3C%3D%3E%3F',
      'characters between "9" and "@": :;<=>?'
    );

    assert.sameValue(
      escape('[\\]^'), '%5B%5C%5D%5E', 'characters between "Z" and "_": [\\]^'
    );

    assert.sameValue(escape('`'), '%60', 'character between "_" and "a": `');

    assert.sameValue(
      escape('{|}~\x7f\x80'),
      '%7B%7C%7D%7E%7F%80',
      'characters following "z": {|}~\\x7f\\x80'
    );

    assert.sameValue(
      escape('\xfd\xfe\xff'), '%FD%FE%FF', '\\xfd\\xfe\\xff'
    );
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_TEST; i++) {
    Test();
}
